const fs = require("fs")
//自动装载对象
module.exports=(filepath,load)=>{
    let data = fs.readFileSync(filepath,"utf-8");
    let obj = [];
    let parameter=[];
    //判断这是一个exports的对象还是module的对象
    let zz = /[^"/]exports\..*?=/g.test(data)?"exports\\..*?=":' [^=.\\n]*?[:]*\\(.*?\\)[=>]*{';
    //遍历注解
    load.forEach(annotation=>{
        //解析第一个注解
        let jx = data.match(new RegExp(`(((["'\`][ ]*)|(/*[ ]*))${annotation}(\\(.*?\\))*($|([\r\n "'\`]+)))|(${zz})|(module.exports)`,'g'));
        if(!jx)return;
        jx.map(e=>{
            // 判断e是注解还是方法
            if(new RegExp(`((["'\`][ ]*)|(/*[ ]*))${annotation}(\\(.*?\\))*[ ]*["'\`]*`,'g').test(e)){
                //这是一个注解，解析出来参数
                e=e.match(/\([ ]*.*?\)/g);
                if(e){
                    //先解析出字符串
                   e = e[0].replace(/[()]/g,"");
                   let str = (e.match(/(".*?")|('.*?')|(`.*?`)/g) || []).map(e=>e.substring(1,e.length-1));
                   let i=0;
                   return e.replace(/(".*?")|('.*?')|(`.*?`)/g,"gem_2021_7_17_2:43_gem")
                       .split(",").filter(e=>e).map(e=>{
                         if(e==="gem_2021_7_17_2:43_gem"){return str[i++]}
                         return e;
                       })
                }
                return [];
            }else if(new RegExp(zz,'g').test(e)){
                // 这是一个方法，解析出来方法名
                return e.replace(/(exports\.)|=|([ ]*async )|([:]*\(.*?\)[=>]*{)|[ ]*/g,"");
            }else{
                return 'this';
            }
        }).forEach(e=>{
            //解析结果
            if(typeof e === 'string'){
                //这是方法名
                parameter.forEach(par=>{
                    obj.push({ annotation, name:e, parameter:par })
                })
                parameter=[];
            }else{
                //这是参数
                parameter.push(e);
            }
        });
    })
    return obj;
}